#include <iostream>
typedef struct
{
	char name[20];//姓名
	char gender[3];//性别
	char birthday[20];//出生日期
	char startworkdate[20];//参加工作日期
	char department[20];//所属部门
	char personnel_category[20];//人员类别
	int technical_grade;// 技术等级
	char technical_titles[20];//技术职称
	char degree_of_educaation[10];//文化程度
	char nation[20];//民族
	char native__please[50];//籍贯
	char present_adress[50];//现住址
	double  base_pay;//基本工资
	double  job_subisidy;//岗位津贴
	double  escalsting_wage;//物价补贴
	double  wage_sttached_to_a_post;//职务津贴
	double  housing_add;//住房补贴
	double chummage;//房租
	double  ovrtime_pay;//加班费
	double  night_duty_allowance;//夜班费
	double  sick_leave_deduction;//病假扣款
	double  personal_leave_deduction;//事假扣款
	double  absenteism_deduction;//旷工扣款
	double  other_deductions;//其它扣款
	double  net_payroll;//实发工资
	int attendance_days;//职工的出勤日数
	int injured_days;//公伤日数
	int materniy_leave_days;//产假日数
	int Sick_days;//病假日数
	int absenteism_days;//旷工日数
	int personal_leave_dayds;//事假日数
	int ovrtime_days;//加班日数
	int night_duty_days;//夜班日数
	int sick_leave_coefficient;//病假系数
}Employee;//职工出勤


struct Node 
{
	void* data;
	Node* next;
};



void Menu(Node*phead);//主菜单
void menu8(Node*phead);//计算工资菜单
void menu9(Node*phead);//打印菜单

Node* AddAll(Node*phead, int n, void* (*pFunc)());//添加节点，并调用函数对数据域赋值
void* InputEmployee();//赋值函数
void read(Node*phead, int n);//文件读
void write(Node*phead);//文件写
void ShowEmployee(void* data);//数据域输出

void Release(Node* phead);//释放链表
void Traversal(Node* phead, void pFunc2(void* data));//遍历链表，显示数据域信息

void menu1(Node* phead);//统计菜单
void count_gender(void* data, int a[1]);//按性别统计
void count_department(void*data, char str[20], int *n);//按部门统计
void count_personnel_category(void*data, char str[20],int *n);//按人员统计
void count_technical_grade(void*data, int t, int *n);//按技术等级统计
void count_technical_titles(void*data, char str[20],int *n);//按技术职称统计
void count_degree_of_educaation(void*data, char str[20],int *n);//按文化程度统计
void count_nation(void*data, char str[20],int *n);//按民族统计
void count_native__please(void*data, char str[20],int *n);//按籍贯统计

void find_Employee(void*data, char str[20]);//数据查询
void insertion_Employee(Node* phead);//数据插入
void delete_Employee(Node* phead,char str[20]);//数据删除
void change_Employee(Node* phead,char str[20]);//数据修改

void calculate(void* data);//计算工资
void calculate_Employee(Node* phead);//计算个人月工资
void calculate_department(void*data, char str[20], double*n);//计算部门月工资

void print_calculate(Node* phead);//打印工资计算表
void print_Employee(Node* phead, char str[20]);//打印个人工资单
void print_department(Node* phead, char str[20]);//打印部门工资单
void print_all(Node* phead);//打印工资汇总表